﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//文件操作
//如果要将数据进行持久化的保存，可以使用文件。  
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	printf("%d\n", n);
//	return 0;
//}

//int main()
//{
//	int a = 10000;
//	FILE* pf = fopen("test.txt", "wb");//wb读写文件
// //⼆进制的形式写到⽂件中
//	fwrite(&a, 4, 1, pf);
//	fclose(pf);
//	pf = NULL;
//
//	return 0;
//}


//文件操作
//1.打开文件
//2.读/写文件
//3.关闭文件


//stdin stdout stderr三个流的类型是：FILE*，通常称为文件指针
//C语言中，就是通过FILE*的文件指针来维护流的各种操作的。

//缓冲文件系统中，关键的概念是：“文件类型指针”，简称”文件指针“。

//文件的打开和关闭
//文件在读写之前应该先打开文件，在使用结束之后应该关闭文件。
//在编写程序的时候，在打开文件的同时，都会返回一个FILE*的指针变量指向该文件，也相当于建立了指针和文件的关系。
//ANSI C规定使用fopen函数来打开文件，fclose来关闭文件。

//打开文件
//FILE* fopen(const char* filename,const char* mode);//mode表示文件的打开模式

//关闭文件
//int fclose(FILE* stream);

//int main()
//{
//	FILE* pf = fopen("test.txt", "w");//文件的“只读”操作
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//读文件
//
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}


//int main()
//{
//	FILE* pf = fopen("test.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 0;
//	}
//
//	//写文件
//	//fputc('a', pf);
//	//fputc('b', pf);
//	//fputc('c', pf);
//
//	//一个一个字符输进去
//	char ch = 0;
//	for (ch = 'a'; ch <= 'z'; ch++)
//	{
//		fputc(ch, pf);
//	}
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//
//	return 0;
//}

//写文件
//int main()
//{
//	FILE* pf = fopen("test.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 0;
//	}
//
//	//读文件:int fgetc(FILE* stream);//一个一个字符读取
//	//返回值是int类型有两种含义：1.如果成功读取字符的话，返回的是字符的ASCII码值-char
//	//2.如果读取遇到文件末尾，或者读取失败的时候，返回EOF（-1）
//
	//int ch = fgetc(pf);
	//printf("%c\n", ch);

	//ch = fgetc(pf);
	//printf("%c\n", ch);

	//ch = fgetc(pf);
	//printf("%c\n", ch);

	//ch = fgetc(pf);
	//printf("%c\n", ch);
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//
//	return 0;
//}


//读文件
//int main()
//{
//	FILE* pf = fopen("test.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 0;
//	}
//	int ch = 0;
//	while ((ch = fgetc(pf)) != EOF)
//	{
//		printf("%c", ch);
//	}
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//
//	return 0;
//}


//把字符串写进文件，不会把\0写进去
//fputs  - int fputs(const char* str,FILE* stream):
//int main()
//{
//	//1.打开文件
//	FILE* pf = fopen("test.txt", "w");
//	if(pf == NULL)
//	{
//		perror("fopen");
//	}
//	//写文件
//	// 如果要换行自己加\n
//	fputs("hello world\n", pf);//传入字符串的首地址
//	fputs("hello hh", pf);
//
//	//2.关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}


//fgets - char* fgets(char* str,int num,FILE* stream);
//str:读出的数据放在str中（最后一个放\0）  num: 最多读（num-1）个  stream:从流中读数据
//fgets不会换行读取字符串，如果条件允许，会把\n（换行）也读取到
int main()
{
	//1.打开文件
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
	}
	//读文件:读取全部
	char arr[20] = { 0 };
	//不管某行字符多长，函数都会把它拆成多次进行打印
	while (fgets(arr, 20, pf) != NULL)
	{
		printf("%s", arr);
	}
	//fgets(arr, 10, pf);//第一次读第一行
	//printf("%s", arr);

	//fgets(arr, 20, pf);//第二个读第二行
	//printf("%s", arr);

	//2.关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}